/* 
需求:
  创建一个函数, 实现功能: 根据指定的数量 count 和数据 value , 
  创建一个包含 count 个 value 的数组
*/
import axios from 'axios'
// 不使用泛型
function getArray(count: number, value: any): any[] {
  const arr: any[] = []
  for (let index = 0; index < count; index++) {
    arr.push(value)
  }
  return arr
}

const arr = getArray(3, 'abc')
// arr[0].length2

/* 
● 泛型的3个操作
  ○ 定义泛型: 在定义函数时函数名的右侧 <T>
  ○ 使用泛型: 在函数的形参/返回值/函数体中 T
  ○ 指定具体类型: 在调用函数的函数名右侧 <具体类型>      ref<number>() / reactive<>()
*/
function getArray2<T>(count: number, value: T): T[] {
  const arr: T[] = []
  for (let index = 0; index < count; index++) {
    arr.push(value)
  }
  return arr
}

const arr2 = getArray2<string>(4, '123')
// arr2[0].length2

/* 
泛型默认值 <T = string>
*/
function getArray3<T=string>(count: number, value: T): T[] {
  const arr: T[] = []
  for (let index = 0; index < count; index++) {
    arr.push(value)
  }
  return arr
}

/* 
3. 泛型约束
<T extends U>
*/
// 定义包含length属性的接口
interface Lengthable {
  length: number
}

// 感觉TS中将泛型看待成接口还是类?   
// T是一个特别的接口
function getLength<T extends Lengthable>(value: T): number {
  return value.length
}

getLength('abc') // 字符串有length
// getLength(123) // error  数字没有length